# -*- coding: utf-8 -*-

"""
@author: 11238 Diogo Silva
@author: 11392 Raul Gonçalo Palma
@last updated: 30/11/2014
@obs: Modulo que contém os métodos necessários para realizar operações na base
 de dados
"""

from ReadXlsFile import *
import sqlite3


class WorkingDB:
    """
    Classe que efetua operacões relacionadas com a base de dados
    """

    IPC_GLOBAL = "IPC_Global"
    VARIACAO_ANUAL = "Variacao_Anual"
    REMUNERACAO_MINIMA_MENSAL = "Remuneracao_Minima_Mensal"
    REMUNERACAO_MAXIMA_MENSAL = "Remuneracao_Maxima_Mensal"
    PIB_PER_CAPITA_ANUAL = "Pib_Per_Capita_anual"
    RENDIMENTO_NACIONAL_BRUTO_PER_CAPITA_ANUAL = "Rendimento_Nacional" + \
                                                 "_Bruto_Per_Capita_Anual"
    RENDIMENTO_DISPONIVEL_BRUTO_PER_CAPITA_ANUAL = "Rendimento_Disponivel" + \
                                                   "_Bruto_Per_Capita_Anual"
    REMUNERACOES_PER_CAPITA_ANUAL = "Remuneracoes_Per_Capita_Anual"

    def __init__(self, data_base):
        """
        Construtor da classe WorkingDB
        :param data_base: Nome da base de dados
        """
        self.connection = sqlite3.connect(data_base)
        self.cursor = self.connection.cursor()

    def create_table(self):
        """
        Cria uma tabela
        """
        self.cursor.execute("""drop table if exists estatisticas""")
        self.cursor.execute("""create table estatisticas
                 (ano numeric,
                  IPC_Global real,
                  Variacao_Anual real,
                  Remuneracao_Minima_Mensal real,
                  Remuneracao_Maxima_Mensal real,
                  Pib_Per_Capita_anual real,
                  Rendimento_Nacional_Bruto_Per_Capita_Anual real,
                  Rendimento_Disponivel_Bruto_Per_Capita_Anual real,
                  Remuneracoes_Per_Capita_Anual real)""")

    def insert_data(self, xls_file, sheet_number):
        """
        Insere os dados numa tabela
        :param xls_file: O ficheiro xls
        :param sheet_number: O número da folha de onde vão ser lidos os dados
        """
        r_xls = ReadXlsFile(xls_file, sheet_number)
        self.cursor.executemany("""insert into estatisticas
            values (?,?,?,?,?,?,?,?,?)""", r_xls.read_rows())
        self.connection.commit()

    def create_populate_table(self, xls_file, sheet_number):
        """
        Cria a tabela e insere os dados na mesma
        :param xls_file: O ficheiro xls
        :param sheet_number: A o número da folha de onde vão ser lidos os dados
        """
        self.create_table()
        self.insert_data(xls_file, sheet_number)

    def queries(self, init_year, final_year, field):
        """
        Faz consultas à base de dados
        :param init_year: Ano inical
        :param final_year: Ano final
        :param field: Campo da tabela
        :return: Retorna duas listas uma com intervalo de anos escolhido
        e outra com os valores correspondentes a esse intervalo
        """
        years = []
        for row in self.cursor.execute("SELECT ano FROM estatisticas"):
            years.append(row[0])

        values = []
        for row in \
                self.cursor.execute("SELECT " + field + " FROM estatisticas"):
            values.append(row[0])

        init_index = years.index(init_year)
        final_index = years.index(final_year)

        range_years = []
        for i in years[init_index:final_index + 1]:
            range_years.append(i)

        range_values = []
        for i in values[init_index:final_index + 1]:
            range_values.append(i)

        return range_years, range_values
